import chalk from 'chalk'; // 用于颜色化输出
import { LoggerService } from "@nestjs/common";
import * as DailyRotateFile from "winston-daily-rotate-file";
import { createLogger, Logger, format, transports } from "winston";

// 定义日志级别颜色
const levelsColors = {
    error: 'red',
    warn: 'yellow',
    info: 'green',
    debug: 'blue',
    verbose: 'cyan',
  };

const myFormat = format.printf(({ level, message, label, timestamp }) => {
    return `${timestamp} [${label}] ${level}: ${message}`;
  });

// 自定义日志系统
export class MyLogger implements LoggerService {
  private logger: Logger;

  constructor(context: string) {
        this.logger = createLogger({
        format: format.combine(
            format.label({ label: 'kizi' }),
            format.timestamp(),
            format.prettyPrint()
            // myFormat
        ),
        transports: [
            new DailyRotateFile({
                filename: `myLog/errors/error-%DATE%.log`, // 日志名称，占位符 %DATE% 取值为 datePattern 值。
                datePattern: 'YYYY-MM-DD', // 日志轮换的频率，此处表示每天。
                zippedArchive: true, // 是否通过压缩的方式归档被轮换的日志文件。
                maxSize: '10m', // 设置日志文件的最大大小，m 表示 mb 。
                maxFiles: '14d',   // 保留日志文件的最大天数，此处表示自动删除超过 14 天的日志文件。
                level: 'error' // 日志类型，此处表示只记录错误日志。
            }),
            new DailyRotateFile({
                filename: 'myLog/warnings/warning-%DATE%.log',
                datePattern: 'YYYY-MM-DD',
                zippedArchive: true,
                maxSize: '20m',
                maxFiles: '14d',
                level: 'warn',
              }),
            new DailyRotateFile({
                filename: `myLog/info/info-%DATE%.log`,
                datePattern: 'YYYY-MM-DD',
                zippedArchive: true,
                maxSize: '10m',
                maxFiles: '14d',
            }),
            new transports.Console({
                format: format.combine(
                  format.colorize({
                    colors: levelsColors,
                  }),
                  format.simple(),
                  format.printf((info) => {
                    // 获取 Info Symbols key
                    const symbols = Object.getOwnPropertySymbols(info);
                    const color = levelsColors[info[symbols[0]] as string]; // 获取日志级别的颜色
                    const chalkColor = chalk[color];
                    const message = `${chalkColor(info.timestamp)} ${chalkColor(info[symbols[2]])}`;
                    return message;
                  }),
                ),
                level: 'debug',
            }),
        ]
    })
  }

  log(message: any, ...optionalParams: any[]) {
      this.logger.info(message, ...optionalParams);
  }

  error(message: any, ...optionalParams: any[]) {
      this.logger.error(message, ...optionalParams);
  }

  warn(message: any, ...optionalParams: any[]) {
      this.logger.warn(message, ...optionalParams);

  }
}